"""
配置文件生成模块

提供配置文件生成功能，包括TOML格式配置文件的生成。
"""

import tomllib
from typing import Dict, Any, Optional
from pathlib import Path

from .templates import ConfigTemplates


def generate_toml_config(config: Dict[str, Any], db_type: str) -> str:
    """生成TOML格式的配置文件内容
    
    参数:
        config (Dict[str, Any]): 配置数据字典
        db_type (str): 数据库类型 (mysql, postgresql, mariadb)
    
    返回:
        str: TOML格式的配置文件内容
    """
    # 获取TOML模板
    template = ConfigTemplates.get_backup_config_template()
    
    # 格式化模板
    port_example = 3306 if db_type == "mysql" else 5432
    
    # 处理commit_message中的{timestamp}占位符
    commit_message = config["backup"]["git"]["commit_message"]
    if "{timestamp}" in commit_message:
        # 保留{timestamp}占位符，不做替换
        commit_message = commit_message.replace("{timestamp}", "{timestamp}")
    
    # 格式化TOML值，确保None值被正确处理
    def format_toml_value(value):
        if value is None:
            return '""'  # 将None值替换为空字符串
        elif isinstance(value, str):
            return f'"{value}"'
        else:
            return str(value)
    
    # 处理commit_message中的引号
    commit_message = commit_message.replace('"', '\\"')
    
    return template.format(
        type=config["type"],
        backup_dir=config["backup"]["backup_dir"],
        auto_upload=str(config["backup"]["auto_upload"]).lower(),
        repository_url=format_toml_value(config["backup"]["git"]["repository_url"]),
        local_path=format_toml_value(config["backup"]["git"]["local_path"]),
        username=format_toml_value(config["backup"]["git"]["username"]),
        password=format_toml_value(config["backup"]["git"]["password"]),
        branch=config["backup"]["git"]["branch"],
        commit_message=commit_message,
        git_root_dir=format_toml_value(config["backup"]["git"].get("git_root_dir")),
        backup_relative_path=config["backup"]["git"].get("backup_relative_path", "backups"),
        host=config["database"]["host"],
        port_example=port_example,
        port=config["database"]["port"],
        db_username=config["database"]["username"],
        db_password=config["database"]["password"],
        database=config["database"]["database"],
        timestamp="{timestamp}"  # 添加timestamp参数，保持占位符不变
    )


def save_config_to_file(config: Dict[str, Any], file_path: str) -> None:
    """保存配置到TOML文件
    
    参数:
        config (Dict[str, Any]): 配置数据字典
        file_path (str): 文件路径
    """
    # 确保目录存在
    Path(file_path).parent.mkdir(parents=True, exist_ok=True)
    
    # 写入文件
    with open(file_path, 'w', encoding='utf-8') as f:
        toml.dump(config, f)


def generate_config_file(db_type: str, output_path: str) -> None:
    """生成配置文件
    
    参数:
        db_type (str): 数据库类型
        output_path (str): 输出文件路径
    """
    # 获取默认配置
    config = ConfigTemplates.get_backup_config_dict()
    
    # 设置数据库类型
    config['type'] = db_type
    
    # 根据数据库类型设置默认端口
    if db_type == "postgresql":
        config["database"]["port"] = 5432
    elif db_type == "mysql":
        config["database"]["port"] = 3306
    elif db_type == "mariadb":
        config["database"]["port"] = 3306
    
    # 使用tomllib验证配置格式（如果需要）
    # 注意：tomllib只提供读取功能，不提供写入功能
    # 我们仍然使用模板方法生成TOML内容
    toml_content = generate_toml_config(config, db_type)
    
    # 验证生成的TOML内容是否有效
    try:
        import io
        # tomllib需要二进制模式，所以我们需要将字符串转换为字节流
        toml_bytes = io.BytesIO(toml_content.encode('utf-8'))
        tomllib.load(toml_bytes)
    except Exception as e:
        raise ValueError(f"生成的TOML配置无效: {e}")
    
    # 写入文件
    output_path_obj = Path(output_path)
    output_path_obj.parent.mkdir(parents=True, exist_ok=True)
    
    with open(output_path_obj, 'w', encoding='utf-8') as f:
        f.write(toml_content)